/**
 * 在事务内删除流程的业务单据和流程实例
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域

  return function ({ UID, force, ...CardDArgs }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");

    // 获取要删除记录的ID数组
    const ids = [];
    if (CardDArgs.Record) {
      ids.push(CardDArgs.Record.ID);
    }
    if (CardDArgs.Records) {
      CardDArgs.Records.forEach(Record => {
        ids.push(Record.ID);
      });
    }
    if (CardDArgs.ID) {
      ids.push(CardDArgs.ID);
    }

    ids.forEach(id => {
      // 加载单据数据
      const record = A.card[CardDArgs.Card].load(id);
      if (!record) throw Error(`要删除的单据(ID为${id})已经不存在`);

      // 加载流程实例信息
      const { Rows: [instance] } = A.job.CardR(UID, 'B.流程实例', ['当前节点.类型'], [['ID', '=', record.流程实例]]);
      if (!instance) throw Error(`要删除的单据(ID为${id})对应的流程实例不存在`);
      if (!force && instance['当前节点.类型'] !== 1) throw Error('不在开始节点的单据不能删除');

      // 事务中删除
      A.db.trans('MP', conn => {
        // 清理待办事项
        A.db.execute(conn, "DELETE B_LCDB WHERE LCSL_ID=?", [record.流程实例]);
        // 清除流程记录
        A.db.execute(conn, "DELETE B_LCJL WHERE LCSL_ID=?", [record.流程实例]);
        // 删除流程实例
        A.db.execute(conn, "DELETE B_LCSL WHERE ID=?", [record.流程实例]);
        // 删除业务数据. 可能不是MP连接，所以放最后执行至少能保证MP的事务成功了才执行
        A.job.CardD({ UID, ...CardDArgs });
      });
    });

    // 返回结果
    return true;
  };
})()